package com.spring.demo2.eg1;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;

/**
 * spring容器在bean注册阶段中会获取容器中所有类型为 BeanDefinitionRegistryPostProcessor 的bean，
 * 然后会调用他们的postProcessBeanDefinitionRegistry 方法
 * <br>
 * Spring容器中主要的4个阶段
 * 阶段1：Bean注册阶段，此阶段会完成所有bean的注册
 * 阶段2：BeanFactory后置处理阶段
 * 阶段3：注册BeanPostProcessor
 * 阶段4：bean创建阶段，此阶段完成所有单例bean的注册和装载操作
 * <br>
 * 4个阶段的源码为位于这个方法：org.springframework.context.support.AbstractApplicationContext#refresh
 * 分别对应内容：
 * 1.invokeBeanFactoryPostProcessors(beanFactory);
 * // 对应阶段1和阶段2：调用上下文中注册为bean的工厂处理器，即调用BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor接口中的方法
 * 2.registerBeanPostProcessors(beanFactory);
 * // 对应阶段3：注册拦截bean创建的bean处理器，即注册BeanPostProcessor
 * 3.finishBeanFactoryInitialization(beanFactory);
 * // 对应阶段4：实例化所有剩余的（非延迟初始化）单例
 *
 * @author vhans
 */
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, Ordered {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        // 定义一个字符串类型的bean，将其注册到spring容器中
        beanDefinitionRegistry.registerBeanDefinition("name", BeanDefinitionBuilder
                .genericBeanDefinition(String.class)
                .addConstructorArgValue("Vhans")
                .getBeanDefinition());
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }

    @Override
    public int getOrder() {
        return 1;
    }
}
